#ifndef __LIST_H__
#define __LIST_H__

#include "type.h"

typedef struct list_entry_t {
    struct list_entry_t* prev;
    struct list_entry_t* next;
} list_entry_t;

__attribute__((always_inline)) static inline void
__list_add(list_entry_t* elm, list_entry_t* prev, list_entry_t* next) {
    prev->next = next->prev = elm;
    elm->next = next;
    elm->prev = prev;
}

__attribute__((always_inline)) static inline void
__list_del(list_entry_t* prev, list_entry_t* next) {
    prev->next = next;
    next->prev = prev;
}

__attribute__((always_inline)) static inline void
list_init(list_entry_t* elm) {
    elm->prev = elm->next = elm;
}

__attribute__((always_inline)) static inline void
list_add_before(list_entry_t* listelm, list_entry_t* elm) {
    __list_add(elm, listelm->prev, listelm);
}

__attribute__((always_inline)) static inline void
list_add_after(list_entry_t* listelm, list_entry_t* elm) {
    __list_add(elm, listelm, listelm->next);
}

__attribute__((always_inline)) static inline void
list_add(list_entry_t* listelm, list_entry_t* elm) {
    list_add_after(listelm, elm);
}

__attribute__((always_inline)) static inline void
list_del(list_entry_t* listelm) {
    __list_del(listelm->prev, listelm->next);
}

__attribute__((always_inline)) static inline void
list_delInit(list_entry_t* listelm) {
    list_del(listelm);
    list_init(listelm);
}

__attribute__((always_inline)) static inline bool
list_empty(list_entry_t* list) {
    return list->next == list;
}

__attribute__((always_inline)) static inline list_entry_t*
list_prev(list_entry_t* list) {
    return list->prev;
}

__attribute__((always_inline)) static inline list_entry_t*
list_next(list_entry_t* list) {
    return list->next;
}

#endif